﻿using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;

namespace MCEMediaManager
{
    public class WinAPI
    {
        #region WM Constants
        public const Int32 WM_ACTIVATE = 0x0006;
        public const Int32 WM_ACTIVATEAPP = 0x001C;
        public const Int32 WM_AFXFIRST = 0x0360;
        public const Int32 WM_AFXLAST = 0x037F;
        public const Int32 WM_APP = 0x8000;
        public const Int32 WM_ASKCBFORMATNAME = 0x030C;
        public const Int32 WM_CANCELJOURNAL = 0x004B;
        public const Int32 WM_CANCELMODE = 0x001F;
        public const Int32 WM_CAPTURECHANGED = 0x0215;
        public const Int32 WM_CHANGECBCHAIN = 0x030D;
        public const Int32 WM_CHANGEUISTATE = 0x0127;
        public const Int32 WM_CHAR = 0x0102;
        public const Int32 WM_CHARTOITEM = 0x002F;
        public const Int32 WM_CHILDACTIVATE = 0x0022;
        public const Int32 WM_CLEAR = 0x0303;
        public const Int32 WM_CLOSE = 0x0010;
        public const Int32 WM_COMMAND = 0x0111;
        public const Int32 WM_COMPACTING = 0x0041;
        public const Int32 WM_COMPAREITEM = 0x0039;
        public const Int32 WM_CONTEXTMENU = 0x007B;
        public const Int32 WM_COPY = 0x0301;
        public const Int32 WM_COPYDATA = 0x004A;
        public const Int32 WM_CREATE = 0x0001;
        public const Int32 WM_CTLCOLORBTN = 0x0135;
        public const Int32 WM_CTLCOLORDLG = 0x0136;
        public const Int32 WM_CTLCOLOREDIT = 0x0133;
        public const Int32 WM_CTLCOLORLISTBOX = 0x0134;
        public const Int32 WM_CTLCOLORMSGBOX = 0x0132;
        public const Int32 WM_CTLCOLORSCROLLBAR = 0x0137;
        public const Int32 WM_CTLCOLORSTATIC = 0x0138;
        public const Int32 WM_CUT = 0x0300;
        public const Int32 WM_DEADCHAR = 0x0103;
        public const Int32 WM_DELETEITEM = 0x002D;
        public const Int32 WM_DESTROY = 0x0002;
        public const Int32 WM_DESTROYCLIPBOARD = 0x0307;
        public const Int32 WM_DEVICECHANGE = 0x0219;
        public const Int32 WM_DEVMODECHANGE = 0x001B;
        public const Int32 WM_DISPLAYCHANGE = 0x007E;
        public const Int32 WM_DRAWCLIPBOARD = 0x0308;
        public const Int32 WM_DRAWITEM = 0x002B;
        public const Int32 WM_DROPFILES = 0x0233;
        public const Int32 WM_ENABLE = 0x000A;
        public const Int32 WM_ENDSESSION = 0x0016;
        public const Int32 WM_ENTERIDLE = 0x0121;
        public const Int32 WM_ENTERMENULOOP = 0x0211;
        public const Int32 WM_ENTERSIZEMOVE = 0x0231;
        public const Int32 WM_ERASEBKGND = 0x0014;
        public const Int32 WM_EXITMENULOOP = 0x0212;
        public const Int32 WM_EXITSIZEMOVE = 0x0232;
        public const Int32 WM_FONTCHANGE = 0x001D;
        public const Int32 WM_GETDLGCODE = 0x0087;
        public const Int32 WM_GETFONT = 0x0031;
        public const Int32 WM_GETHOTKEY = 0x0033;
        public const Int32 WM_GETICON = 0x007F;
        public const Int32 WM_GETMINMAXINFO = 0x0024;
        public const Int32 WM_GETOBJECT = 0x003D;
        public const Int32 WM_GETTEXT = 0x000D;
        public const Int32 WM_GETTEXTLENGTH = 0x000E;
        public const Int32 WM_HANDHELDFIRST = 0x0358;
        public const Int32 WM_HANDHELDLAST = 0x035F;
        public const Int32 WM_HELP = 0x0053;
        public const Int32 WM_HOTKEY = 0x0312;
        public const Int32 WM_HSCROLL = 0x0114;
        public const Int32 WM_HSCROLLCLIPBOARD = 0x030E;
        public const Int32 WM_ICONERASEBKGND = 0x0027;
        public const Int32 WM_IME_CHAR = 0x0286;
        public const Int32 WM_IME_COMPOSITION = 0x010F;
        public const Int32 WM_IME_COMPOSITIONFULL = 0x0284;
        public const Int32 WM_IME_CONTROL = 0x0283;
        public const Int32 WM_IME_ENDCOMPOSITION = 0x010E;
        public const Int32 WM_IME_KEYDOWN = 0x0290;
        public const Int32 WM_IME_KEYLAST = 0x010F;
        public const Int32 WM_IME_KEYUP = 0x0291;
        public const Int32 WM_IME_NOTIFY = 0x0282;
        public const Int32 WM_IME_REQUEST = 0x0288;
        public const Int32 WM_IME_SELECT = 0x0285;
        public const Int32 WM_IME_SETCONTEXT = 0x0281;
        public const Int32 WM_IME_STARTCOMPOSITION = 0x010D;
        public const Int32 WM_INITDIALOG = 0x0110;
        public const Int32 WM_INITMENU = 0x0116;
        public const Int32 WM_INITMENUPOPUP = 0x0117;
        public const Int32 WM_INPUTLANGCHANGE = 0x0051;
        public const Int32 WM_INPUTLANGCHANGEREQUEST = 0x0050;
        public const Int32 WM_KEYDOWN = 0x0100;
        public const Int32 WM_KEYFIRST = 0x0100;
        public const Int32 WM_KEYLAST = 0x0108;
        public const Int32 WM_KEYUP = 0x0101;
        public const Int32 WM_KILLFOCUS = 0x0008;
        public const Int32 WM_LBUTTONDBLCLK = 0x0203;
        public const Int32 WM_LBUTTONDOWN = 0x0201;
        public const Int32 WM_LBUTTONUP = 0x0202;
        public const Int32 WM_MBUTTONDBLCLK = 0x0209;
        public const Int32 WM_MBUTTONDOWN = 0x0207;
        public const Int32 WM_MBUTTONUP = 0x0208;
        public const Int32 WM_MDIACTIVATE = 0x0222;
        public const Int32 WM_MDICASCADE = 0x0227;
        public const Int32 WM_MDICREATE = 0x0220;
        public const Int32 WM_MDIDESTROY = 0x0221;
        public const Int32 WM_MDIGETACTIVE = 0x0229;
        public const Int32 WM_MDIICONARRANGE = 0x0228;
        public const Int32 WM_MDIMAXIMIZE = 0x0225;
        public const Int32 WM_MDINEXT = 0x0224;
        public const Int32 WM_MDIREFRESHMENU = 0x0234;
        public const Int32 WM_MDIRESTORE = 0x0223;
        public const Int32 WM_MDISETMENU = 0x0230;
        public const Int32 WM_MDITILE = 0x0226;
        public const Int32 WM_MEASUREITEM = 0x002C;
        public const Int32 WM_MENUCHAR = 0x0120;
        public const Int32 WM_MENUCOMMAND = 0x0126;
        public const Int32 WM_MENUDRAG = 0x0123;
        public const Int32 WM_MENUGETOBJECT = 0x0124;
        public const Int32 WM_MENURBUTTONUP = 0x0122;
        public const Int32 WM_MENUSELECT = 0x011F;
        public const Int32 WM_MOUSEACTIVATE = 0x0021;
        public const Int32 WM_MOUSEFIRST = 0x0200;
        public const Int32 WM_MOUSEHOVER = 0x02A1;
        public const Int32 WM_MOUSELAST = 0x020D;
        public const Int32 WM_MOUSELEAVE = 0x02A3;
        public const Int32 WM_MOUSEMOVE = 0x0200;
        public const Int32 WM_MOUSEWHEEL = 0x020A;
        public const Int32 WM_MOUSEHWHEEL = 0x020E;
        public const Int32 WM_MOVE = 0x0003;
        public const Int32 WM_MOVING = 0x0216;
        public const Int32 WM_NCACTIVATE = 0x0086;
        public const Int32 WM_NCCALCSIZE = 0x0083;
        public const Int32 WM_NCCREATE = 0x0081;
        public const Int32 WM_NCDESTROY = 0x0082;
        public const Int32 WM_NCHITTEST = 0x0084;
        public const Int32 WM_NCLBUTTONDBLCLK = 0x00A3;
        public const Int32 WM_NCLBUTTONDOWN = 0x00A1;
        public const Int32 WM_NCLBUTTONUP = 0x00A2;
        public const Int32 WM_NCMBUTTONDBLCLK = 0x00A9;
        public const Int32 WM_NCMBUTTONDOWN = 0x00A7;
        public const Int32 WM_NCMBUTTONUP = 0x00A8;
        public const Int32 WM_NCMOUSEMOVE = 0x00A0;
        public const Int32 WM_NCPAINT = 0x0085;
        public const Int32 WM_NCRBUTTONDBLCLK = 0x00A6;
        public const Int32 WM_NCRBUTTONDOWN = 0x00A4;
        public const Int32 WM_NCRBUTTONUP = 0x00A5;
        public const Int32 WM_NEXTDLGCTL = 0x0028;
        public const Int32 WM_NEXTMENU = 0x0213;
        public const Int32 WM_NOTIFY = 0x004E;
        public const Int32 WM_NOTIFYFORMAT = 0x0055;
        public const Int32 WM_NULL = 0x0000;
        public const Int32 WM_PAINT = 0x000F;
        public const Int32 WM_PAINTCLIPBOARD = 0x0309;
        public const Int32 WM_PAINTICON = 0x0026;
        public const Int32 WM_PALETTECHANGED = 0x0311;
        public const Int32 WM_PALETTEISCHANGING = 0x0310;
        public const Int32 WM_PARENTNOTIFY = 0x0210;
        public const Int32 WM_PASTE = 0x0302;
        public const Int32 WM_PENWINFIRST = 0x0380;
        public const Int32 WM_PENWINLAST = 0x038F;
        public const Int32 WM_POWER = 0x0048;
        public const Int32 WM_POWERBROADCAST = 0x0218;
        public const Int32 WM_PRINT = 0x0317;
        public const Int32 WM_PRINTCLIENT = 0x0318;
        public const Int32 WM_QUERYDRAGICON = 0x0037;
        public const Int32 WM_QUERYENDSESSION = 0x0011;
        public const Int32 WM_QUERYNEWPALETTE = 0x030F;
        public const Int32 WM_QUERYOPEN = 0x0013;
        public const Int32 WM_QUEUESYNC = 0x0023;
        public const Int32 WM_QUIT = 0x0012;
        public const Int32 WM_RBUTTONDBLCLK = 0x0206;
        public const Int32 WM_RBUTTONDOWN = 0x0204;
        public const Int32 WM_RBUTTONUP = 0x0205;
        public const Int32 WM_RENDERALLFORMATS = 0x0306;
        public const Int32 WM_RENDERFORMAT = 0x0305;
        public const Int32 WM_SETCURSOR = 0x0020;
        public const Int32 WM_SETFOCUS = 0x0007;
        public const Int32 WM_SETFONT = 0x0030;
        public const Int32 WM_SETHOTKEY = 0x0032;
        public const Int32 WM_SETICON = 0x0080;
        public const Int32 WM_SETREDRAW = 0x000B;
        public const Int32 WM_SETTEXT = 0x000C;
        public const Int32 WM_SETTINGCHANGE = 0x001A;
        public const Int32 WM_SHOWWINDOW = 0x0018;
        public const Int32 WM_SIZE = 0x0005;
        public const Int32 WM_SIZECLIPBOARD = 0x030B;
        public const Int32 WM_SIZING = 0x0214;
        public const Int32 WM_SPOOLERSTATUS = 0x002A;
        public const Int32 WM_STYLECHANGED = 0x007D;
        public const Int32 WM_STYLECHANGING = 0x007C;
        public const Int32 WM_SYNCPAINT = 0x0088;
        public const Int32 WM_SYSCHAR = 0x0106;
        public const Int32 WM_SYSCOLORCHANGE = 0x0015;
        public const Int32 WM_SYSCOMMAND = 0x0112;
        public const Int32 WM_SYSDEADCHAR = 0x0107;
        public const Int32 WM_SYSKEYDOWN = 0x0104;
        public const Int32 WM_SYSKEYUP = 0x0105;
        public const Int32 WM_TCARD = 0x0052;
        public const Int32 WM_TIMECHANGE = 0x001E;
        public const Int32 WM_TIMER = 0x0113;
        public const Int32 WM_UNDO = 0x0304;
        public const Int32 WM_UNINITMENUPOPUP = 0x0125;
        public const Int32 WM_USER = 0x0400;
        public const Int32 WM_USERCHANGED = 0x0054;
        public const Int32 WM_VKEYTOITEM = 0x002E;
        public const Int32 WM_VSCROLL = 0x0115;
        public const Int32 WM_VSCROLLCLIPBOARD = 0x030A;
        public const Int32 WM_WINDOWPOSCHANGED = 0x0047;
        public const Int32 WM_WINDOWPOSCHANGING = 0x0046;
        public const Int32 WM_WININICHANGE = 0x001A;
        public const Int32 WM_XBUTTONDBLCLK = 0x020D;
        public const Int32 WM_XBUTTONDOWN = 0x020B;
        public const Int32 WM_XBUTTONUP = 0x020C;
        #endregion

        #region Virtual Keys
        public enum VK
        {
            LBUTTON = 0x01,  // Left mouse button
            RBUTTON = 0x02,  // Right mouse button
            CANCEL = 0x03,  // Control-break processing
            MBUTTON = 0x04,  // Middle mouse button (three-button mouse)
            XBUTTON1 = 0x05,  // Windows 2000/XP: X1 mouse button
            XBUTTON2 = 0x06,  // Windows 2000/XP: X2 mouse button
            //            0x07   // Undefined
            BACK = 0x08,  // BACKSPACE key
            TAB = 0x09,  // TAB key
            //           0x0A-0x0B,  // Reserved
            CLEAR = 0x0C,  // CLEAR key
            RETURN = 0x0D,  // ENTER key
            //        0x0E-0x0F, // Undefined
            SHIFT = 0x10,  // SHIFT key
            CONTROL = 0x11,  // CTRL key
            MENU = 0x12,  // ALT key
            PAUSE = 0x13,  // PAUSE key
            CAPITAL = 0x14,  // CAPS LOCK key
            KANA = 0x15,  // Input Method Editor (IME) Kana mode
            HANGUL = 0x15,  // IME Hangul mode
            //            0x16,  // Undefined
            JUNJA = 0x17,  // IME Junja mode
            FINAL = 0x18,  // IME final mode
            HANJA = 0x19,  // IME Hanja mode
            KANJI = 0x19,  // IME Kanji mode
            //            0x1A,  // Undefined
            ESCAPE = 0x1B,  // ESC key
            CONVERT = 0x1C,  // IME convert
            NONCONVERT = 0x1D,  // IME nonconvert
            ACCEPT = 0x1E,  // IME accept
            MODECHANGE = 0x1F,  // IME mode change request
            SPACE = 0x20,  // SPACEBAR
            PRIOR = 0x21,  // PAGE UP key
            NEXT = 0x22,  // PAGE DOWN key
            END = 0x23,  // END key
            HOME = 0x24,  // HOME key
            LEFT = 0x25,  // LEFT ARROW key
            UP = 0x26,  // UP ARROW key
            RIGHT = 0x27,  // RIGHT ARROW key
            DOWN = 0x28,  // DOWN ARROW key
            SELECT = 0x29,  // SELECT key
            PRINT = 0x2A,  // PRINT key
            EXECUTE = 0x2B,  // EXECUTE key
            SNAPSHOT = 0x2C,  // PRINT SCREEN key
            INSERT = 0x2D,  // INS key
            DELETE = 0x2E,  // DEL key
            HELP = 0x2F,  // HELP key
            KEY_0 = 0x30, // 0 key
            KEY_1 = 0x31,  // 1 key
            KEY_2 = 0x32,  // 2 key
            KEY_3 = 0x33,  // 3 key
            KEY_4 = 0x34,  // 4 key
            KEY_5 = 0x35,  // 5 key
            KEY_6 = 0x36,  // 6 key
            KEY_7 = 0x37,  // 7 key
            KEY_8 = 0x38,  // 8 key
            KEY_9 = 0x39,  // 9 key
            //        0x3A-0x40, // Undefined
            KEY_A = 0x41,  // A key
            KEY_B = 0x42,  // B key
            KEY_C = 0x43,  // C key
            KEY_D = 0x44,  // D key
            KEY_E = 0x45,  // E key
            KEY_F = 0x46,  // F key
            KEY_G = 0x47,  // G key
            KEY_H = 0x48,  // H key
            KEY_I = 0x49,  // I key
            KEY_J = 0x4A,  // J key
            KEY_K = 0x4B,  // K key
            KEY_L = 0x4C,  // L key
            KEY_M = 0x4D,  // M key
            KEY_N = 0x4E,  // N key
            KEY_O = 0x4F,  // O key
            KEY_P = 0x50,  // P key
            KEY_Q = 0x51,  // Q key
            KEY_R = 0x52,  // R key
            KEY_S = 0x53,  // S key
            KEY_T = 0x54,  // T key
            KEY_U = 0x55,  // U key
            KEY_V = 0x56,  // V key
            KEY_W = 0x57,  // W key
            KEY_X = 0x58,  // X key
            KEY_Y = 0x59,  // Y key
            KEY_Z = 0x5A,  // Z key
            LWIN = 0x5B,  // Left Windows key (Microsoft Natural keyboard) 
            RWIN = 0x5C,  // Right Windows key (Natural keyboard)
            APPS = 0x5D,  // Applications key (Natural keyboard)
            //             0x5E, // Reserved
            SLEEP = 0x5F,  // Computer Sleep key
            NUMPAD0 = 0x60,  // Numeric keypad 0 key
            NUMPAD1 = 0x61,  // Numeric keypad 1 key
            NUMPAD2 = 0x62,  // Numeric keypad 2 key
            NUMPAD3 = 0x63,  // Numeric keypad 3 key
            NUMPAD4 = 0x64,  // Numeric keypad 4 key
            NUMPAD5 = 0x65,  // Numeric keypad 5 key
            NUMPAD6 = 0x66,  // Numeric keypad 6 key
            NUMPAD7 = 0x67,  // Numeric keypad 7 key
            NUMPAD8 = 0x68,  // Numeric keypad 8 key
            NUMPAD9 = 0x69,  // Numeric keypad 9 key
            MULTIPLY = 0x6A,  // Multiply key
            ADD = 0x6B,  // Add key
            SEPARATOR = 0x6C,  // Separator key
            SUBTRACT = 0x6D,  // Subtract key
            DECIMAL = 0x6E,  // Decimal key
            DIVIDE = 0x6F,  // Divide key
            F1 = 0x70,  // F1 key
            F2 = 0x71,  // F2 key
            F3 = 0x72,  // F3 key
            F4 = 0x73,  // F4 key
            F5 = 0x74,  // F5 key
            F6 = 0x75,  // F6 key
            F7 = 0x76,  // F7 key
            F8 = 0x77,  // F8 key
            F9 = 0x78,  // F9 key
            F10 = 0x79,  // F10 key
            F11 = 0x7A,  // F11 key
            F12 = 0x7B,  // F12 key
            F13 = 0x7C,  // F13 key
            F14 = 0x7D,  // F14 key
            F15 = 0x7E,  // F15 key
            F16 = 0x7F,  // F16 key
            F17 = 0x80,  // F17 key  
            F18 = 0x81,  // F18 key  
            F19 = 0x82,  // F19 key  
            F20 = 0x83,  // F20 key  
            F21 = 0x84,  // F21 key  
            F22 = 0x85,  // F22 key, (PPC only) Key used to lock device.
            F23 = 0x86,  // F23 key  
            F24 = 0x87,  // F24 key  
            //           0x88-0X8F,  // Unassigned
            NUMLOCK = 0x90,  // NUM LOCK key
            SCROLL = 0x91,  // SCROLL LOCK key
            //           0x92-0x96,  // OEM specific
            //           0x97-0x9F,  // Unassigned
            LSHIFT = 0xA0,  // Left SHIFT key
            RSHIFT = 0xA1,  // Right SHIFT key
            LCONTROL = 0xA2,  // Left CONTROL key
            RCONTROL = 0xA3,  // Right CONTROL key
            LMENU = 0xA4,  // Left MENU key
            RMENU = 0xA5,  // Right MENU key
            BROWSER_BACK = 0xA6,  // Windows 2000/XP: Browser Back key
            BROWSER_FORWARD = 0xA7,  // Windows 2000/XP: Browser Forward key
            BROWSER_REFRESH = 0xA8,  // Windows 2000/XP: Browser Refresh key
            BROWSER_STOP = 0xA9,  // Windows 2000/XP: Browser Stop key
            BROWSER_SEARCH = 0xAA,  // Windows 2000/XP: Browser Search key 
            BROWSER_FAVORITES = 0xAB,  // Windows 2000/XP: Browser Favorites key
            BROWSER_HOME = 0xAC,  // Windows 2000/XP: Browser Start and Home key
            VOLUME_MUTE = 0xAD,  // Windows 2000/XP: Volume Mute key
            VOLUME_DOWN = 0xAE,  // Windows 2000/XP: Volume Down key
            VOLUME_UP = 0xAF,  // Windows 2000/XP: Volume Up key
            MEDIA_NEXT_TRACK = 0xB0,  // Windows 2000/XP: Next Track key
            MEDIA_PREV_TRACK = 0xB1,  // Windows 2000/XP: Previous Track key
            MEDIA_STOP = 0xB2,  // Windows 2000/XP: Stop Media key
            MEDIA_PLAY_PAUSE = 0xB3,  // Windows 2000/XP: Play/Pause Media key
            LAUNCH_MAIL = 0xB4,  // Windows 2000/XP: Start Mail key
            LAUNCH_MEDIA_SELECT = 0xB5,  // Windows 2000/XP: Select Media key
            LAUNCH_APP1 = 0xB6,  // Windows 2000/XP: Start Application 1 key
            LAUNCH_APP2 = 0xB7,  // Windows 2000/XP: Start Application 2 key
            //           0xB8-0xB9,  // Reserved
            OEM_1 = 0xBA,  // Used for miscellaneous characters; it can vary by keyboard.
            // Windows 2000/XP: For the US standard keyboard, the ';:' key 
            OEM_PLUS = 0xBB,  // Windows 2000/XP: For any country/region, the '+' key
            OEM_COMMA = 0xBC,  // Windows 2000/XP: For any country/region, the ',' key
            OEM_MINUS = 0xBD,  // Windows 2000/XP: For any country/region, the '-' key
            OEM_PERIOD = 0xBE,  // Windows 2000/XP: For any country/region, the '.' key
            OEM_2 = 0xBF,  // Used for miscellaneous characters; it can vary by keyboard.
            // Windows 2000/XP: For the US standard keyboard, the '/?' key 
            OEM_3 = 0xC0,  // Used for miscellaneous characters; it can vary by keyboard. 
            // Windows 2000/XP: For the US standard keyboard, the '`~' key 
            //           0xC1-0xD7,  // Reserved
            //           0xD8-0xDA,  // Unassigned
            OEM_4 = 0xDB,  // Used for miscellaneous characters; it can vary by keyboard. 
            // Windows 2000/XP: For the US standard keyboard, the '[{' key
            OEM_5 = 0xDC,  // Used for miscellaneous characters; it can vary by keyboard. 
            // Windows 2000/XP: For the US standard keyboard, the '\|' key
            OEM_6 = 0xDD,  // Used for miscellaneous characters; it can vary by keyboard. 
            // Windows 2000/XP: For the US standard keyboard, the ']}' key
            OEM_7 = 0xDE,  // Used for miscellaneous characters; it can vary by keyboard. 
            // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key
            OEM_8 = 0xDF,  // Used for miscellaneous characters; it can vary by keyboard.
            //            0xE0,  // Reserved
            //            0xE1,  // OEM specific
            OEM_102 = 0xE2,  // Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
            //         0xE3-E4,  // OEM specific
            PROCESSKEY = 0xE5,  // Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
            //            0xE6,  // OEM specific
            PACKET = 0xE7,  // Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
            //            0xE8,  // Unassigned
            //         0xE9-F5,  // OEM specific
            ATTN = 0xF6,  // Attn key
            CRSEL = 0xF7,  // CrSel key
            EXSEL = 0xF8,  // ExSel key
            EREOF = 0xF9,  // Erase EOF key
            PLAY = 0xFA,  // Play key
            ZOOM = 0xFB,  // Zoom key
            NONAME = 0xFC,  // Reserved 
            PA1 = 0xFD,  // PA1 key
            OEM_CLEAR = 0xFE  // Clear key
        }
        #endregion

        // The FindWindowEx function retrieves
        // a handle to a window whose class name 
        // and window name match the specified strings.
        // The function searches child windows, beginning
        // with the one following the specified child window.
        // This function does not perform a case-sensitive search.
        [DllImport("User32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent,
            IntPtr hwndChildAfter, string strClassName, string strWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

        // For Windows Mobile, replace user32.dll with coredll.dll
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        // Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.
        // Also consider whether you're being lazy or not.
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern IntPtr SetFocus(IntPtr hWnd);

        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);

    }
}
